
namespace Core.Contracts.Interfaces
{
    using System;
    using System.Collections.ObjectModel;
    using Enums;

    /// <summary>
    /// Module interface contract
    /// </summary>
    public interface IModule : IConditions, IFeatures, IModifiers, INotifyPropertyChangedEx, ICloneable
    {
        /// <summary>
        /// Obtains or defines the module name
        /// </summary>
        string Name { get;}
        /// <summary>
        /// Obtains or defines the module description
        /// </summary>
        string Description { get;}
        /// <summary>
        /// Obtains or defines the module size
        /// </summary>
        SizesEnum Size { get; }
        /// <summary>
        /// Obtains or defines the module technology level
        /// </summary>
        TechnologyLevelsEnum TechnologyLevel { get;}
        /// <summary>
        /// Determines the activation type
        /// </summary>
        ModuleActivationTypesEnum ActivationType { get;  }
        /// <summary>
        /// Obtains or defines if the module is active
        /// </summary>
        bool IsActive { get; set; }
        /// <summary>
        /// Obtains the module slot group
        /// </summary>
        SlotGroupsEnum SlotGroup { get;  }
        /// <summary>
        /// Obtains the module slot type 
        /// </summary>
        SlotTypesEnum SlotType { get; }
        /// <summary>
        /// Obtains the module group
        /// </summary>
        ModuleGroupsEnum Group { get; }
        /// <summary>
        /// Obtains the module meta group
        /// </summary>
        ModuleMetaGroupsEnum MetaGroup { get; }
        /// <summary>
        /// Determines if the modules can use ammo or charges
        /// </summary>
        bool CanHaveAmmunitions { get; }
        /// <summary>
        /// Obtains or defines the loaded ammunitions
        /// </summary>
        IAmmunition Ammunitions { get; set; }
        /// <summary>
        /// Determines if the module has ammunitions loaded 
        /// </summary>
        bool HasAmmunitionsLoaded { get; }
        /// <summary>
        /// Obtains or defines the list of ammunitions usable by the module
        /// </summary>
        ObservableCollection<IAmmunition> UsableAmmunitions { get; set; }
        /// <summary>
        /// Obtains the usable ammunition type
        /// </summary>
        AmmunitionTypesEnum UsableAmmunitionType { get; }
        /// <summary>
        /// Obtains the module cycle time
        /// </summary>
        double? CycleTime { get; }
    }
}